;CHATTY.MAC;1 20-Mar-81 00:10:39, Edit by MMCM ; INTERFACES FOR CHAOSNET FROM NVT CODE SEARCH PROLOG,STENEX SEARCH MONSYM,MACSYM TITLE CHATTY EXTERN CHAFLG,CTMSTM,CVTCLZ,CHNGTM,ASGPK1,RELPKM,SNDPK1 EXTERN CHPKIA,CHAQGF,CHATTW,CHPMXT,CHAVSO EXTERN TTNETW,CKNNVT,NVTXGA,NVTCHS,TTCOBI EXTERN NVTSTD,NVTSTP,TODCLK,NEGTM0,NEGCH1,DETCVT EXTERN NVTRRR,NETTEO,NETTOO,NVTOPF,PBRCNT,TTECT,TTOCT,TTRLOB INTERN CVTDET,CVTCAP,CHANEG,CHATCS,CVTUPI,PTCONN INTERN CHKCVT DEFINE RCALL (RTN,R) < ;;;USED FOR DEBUGGING: CALL ROUTINE WITH 'REASON' IFN CHSDBG, CALL RTN > PTCONN: POINT 18,TTNETW(T2),35 ;CHAOSNET CONNECTION FOR THIS TTY ;IS THIS LINE A CHAOSNET TTY? CHKCVT: ACVAR MOVSI W1,NVTCHS TDNN W1,TTNETW(T2) RET RETSKP ;CLOSE A CHAOSNET TTY CONNECTION CVTDET: SAVEQ LDB Q1,PTCONN JRST CVTCLZ ;CALLED ON INPUT WAIT CVTCAP: PUSH P,T2 NOINT ; Protect any possible ilocks CALL CKNNVT ; If not new nvt JRST CVTCA1 ; Skip sending ga CALL NVTXGA ; SEND GA IF NEEDED CVTCA1: OKINT POP P,T2 RET ;CHECK FOR OVERDUE NEGOTIATIONS FROM CHAOS BACKGROUND FORK CHANEG: MOVE T1,TODCLK ;GET NOW CAMG T1,CHNGTM ;IS OUR TIME RIPE? RET ;NOPE, GET OUT ADD T1,[NEGTM0] ;ADD TIME OUT QUANITY MOVEM T1,CHNGTM ;SAVE TIME FOR NEXT CHECK JRST NEGCH1 ;JOIN NVT CODE ;CHATCS - MOVE TTY OUTPUT TO NET BUFFERS ;T2/ LINE NUMBER RCTOPT==7 ;RCTE OPTION WILOPT==10 ;OFFSET FOR REQUESTS CHATCS: MOVEI T3,(1B) TDNE T3,NVTOPF(T2) CALL CKNNVT JRST CHATC7 ;NO RCTE LDB 3,PBRCNT ; NEED TO SEND RESET? SKIPE T3 ;NEED TO SEND RESET? CALL NVTRRR ;YES, TRY TO SEND CHATC7: SKIPGE XTTFLG##(2) ;IF SCREEN FREEZE IS ON FOR THIS LINE RET ;THEN WAIT FOR USER TO UNFREEZE IT CHATC8: SKIPG TTNETW(T2) ;STILL CONNECTED? JRST TTCOBI ;NO, JUST CLEAR BUFFER LDB Q1,PTCONN ;GET CONNECTION INDEX HRRZ FX,CHASTA(Q1) ;GET CONNECTION STATUS CAIE FX,.CSOPN ;STILL OPENED? JRST TTCOBI ;NO, FORGET OUTPUT IFN CHSDBG,< ;WHEN DEBUGGING, MOVE T4,TODCLK ; NOTE WE'VE DONE SOMETHING FOR THIS FELLOW MOVEM T4,CHATTM(Q1) ; AT THIS TIME WRT TTY OUTPUT >;CHSDBG MOVE T1,TTOCT(T2) ;GET NUMBER OF BYTES TO BE SENT OUT ADD T1,TTECT(T2) ;INCLUDE THOSE IN ECHO BUFFER CAMLE T1,CHPMXT MOVE T1,CHPMXT ;NO MORE THAN THIS AT A TIME THOUGH ADDI T1,3 ;CONVERT TO WORDS, ROUNDING UP LSH T1,-2 PUSH P,T1 MOVEI Q2,.CODAT ;DATA PACKET PUSH P,T2 ;SAVE TTY NUMBER SKIPG CHANOS(Q1) ;ROOM WITHIN CURRENT WINDOW SIZE FOR ANOTHER PACKET? JRST CHATC9 ;NO RCALL ASGPK1,63 ;CAN ALLOCATE A PACKET NOW? CHATC9: JRST [POP P,T2 ;+++NO, FORGET IT (SHOULDN'T WE REMEMBER WE DIDN'T)? POP P,T1 RET] MOVEI Q2,CHPKDT(FX) HRLI Q2,441000 ;MAKE BYTE POINTER TO DATA PORTION OF PACKET POP P,T2 ;GET BACK TTY NUMBER POP P,P1 ;NO MORE THAN THIS AT A TIME THOUGH LSH P1,2 SETZ T4, ;INIT CHAR COUNT CHATC2: SOJL P1,CHATC5 ;COUNT DOWN LIMIT NOSKED SKIPE TTECT(2) JRST [ CALL NETTEO JRST CHATC3] SKIPE TTOCT(2) JRST [ CALL NETTOO JRST CHATC3] PUSH P,T3 CALL TTRLOB POP P,T3 OKSKED CHATC5: JUMPE T4,[RCALL RELPKM,1 ;DONE IF NO OUTPUT GENERATED RET] STOR T4,CPKNB,(FX) ;PACKET BYTE COUNT PUSH P,T2 ;SAVE TTY NUMBER SETO T1, CALL SNDPK1 ;QUEUE IT TO BE SENT OFF, BUT DON'T BLOCK IFN CHSDBG,< ;WHEN DEBUGGING, MOVE T4,TODCLK ; NOTE WE'VE SUCCESSFULLY DONE SOMETHING MOVEM T4,CHATSM(Q1) ; AT THIS POINT >;CHSDBG POP P,T2 ;GET BACK TTY NUMBER SKIPN TTECT(T2) SKIPE TTOCT(T2) ;SEE IF ANY MORE OUTPUT TO BE GENERATED JRST CHATC8 RET CHATC3: OKSKED IDPB T1,Q2 ;YES. PUT CHAR IN OUR PACKET AOJA T4,CHATC2 ;CVTUPI - UNPACK MESSAGE INTO TTY BUFFERS ;ACCEPTS ; T2/ NVT index ; Q1/ CONNECTION POINTER CVTUPI: STKVAR MOVEM T2,CVUPTT ;SAVE TTY NUMBER CVTUPP: HLRZ FX,CHAIBF(Q1) ;GET NEXT INPUT PACKET JUMPE FX,R ;NO MORE CALL CHPKIA ;HANDLE ACKNOWLEDGEMENT IF DATA PACKET MOVEI Q2,CHAIBF(Q1) CALL CHAQGF ;REMOVE PACKET FROM QUEUE SOS CHANBF(Q1) ;ONE LESS ON QUEUE MOVEM FX,CVUPKT ;SAVE PACKET SKIPL (FX) ;NON-DATA PACKET? JRST CVTUPR ;YES, JUST FLUSH IT LOAD Q2,CPKNB,(FX) ;GET BYTE COUNT OF PACKET MOVEI FX,CHPKDT(FX) HRLI FX,441000 ;BYTE POINTER TO DATA CVTUPL: SOJL Q2,CVTUPR ;COUNT CHARS LEFT IN PKT ILDB T1,FX ;GET CHARACTER MOVE T2,CVUPTT ;GET TTY NUMBER AGAIN LDB T3,NVTSTP ;GET THE CURRENT COMMAND STATE OF THIS SETZ T4, DPB T4,NVTSTP PUSH P,FX ;SAVE BYTE POINTER PUSH P,Q2 ;AND BYTE COUNT CALL @NVTSTD(T3) ;DISPATCH ON IT POP P,Q2 ;GET BACK BYTE COUNT POP P,FX ;AND BYTE POINTER JRST CVTUPL ;DO NEXT CHARACTER CVTUPR: MOVE FX,CVUPKT ;GET BACK PACKET RCALL RELPKM,2 ;DONE WITH THIS PACKET MOVE T2,CVUPTT ;GET TTY AGAIN JRST CVTUPP ;GO SEE IF MORE TO COME END